package com.bblocks.common.anti_reptile.rateLimiter;

import com.bblocks.common.anti_reptile.constant.RuleResultEnum;
import com.bblocks.common.anti_reptile.constant.RuleTypeEnum;
import lombok.NonNull;

import java.util.Optional;
import java.util.concurrent.TimeUnit;

/**
 * <p>Project: bb-anti-reptile - BlackListService</p>
 * <p>描述：黑名单存储服务</p>
 * 方案：
 * 1、查询是否黑名单存在本地存储（存贮全部的id是否属于黑名单），但是会存延时问题（目前默认方案）
 * 2、可以把redis黑名单数据和应用数据做个同步（基于redis key的等的监听），只存储黑名单（未实现）
 *
 * @Author Zhao [125043150@qq.com]
 * @Date 2024/4/15 12:03
 * @Version 1.0
 * @since 8
 */
public interface BlackListService {

    /**
     * 是否有黑名单
     * @param ruleTypeEnum
     * @param id
     * @return !=null 则存在限流黑名单
     */
    RuleResultEnum containBlack(RuleTypeEnum ruleTypeEnum, String id) ;

    /**
     * 加入黑名单
     * @param ruleTypeEnum
     * @param id
     * @param requestUrl
     * @param time
     * @param unit
     * @param theRuleResultEnum 黑名单类型
     * @return
     */
    int join(RuleTypeEnum ruleTypeEnum, String id, String requestUrl, long time, TimeUnit unit,@NonNull RuleResultEnum theRuleResultEnum);

    /**
     * 退出黑名单
     * @param ruleTypeEnum
     * @param id
     * @param theRuleResultEnum 限制的锁定类型（可以空）
     * @return 返回退出类型，空则未退出
     */
    RuleResultEnum out(RuleTypeEnum ruleTypeEnum,String id,RuleResultEnum theRuleResultEnum);
}
